package com.trace.demo.repository;

import com.trace.demo.entity.FarmingActivity;
import com.trace.demo.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 种植活动存储库
 */
@Repository
public interface FarmingActivityRepository extends JpaRepository<FarmingActivity, Long> {

    /**
     * 根据用户ID查找活动记录
     * @param userId 用户ID
     * @return 活动记录列表
     */
    @Query("SELECT f FROM FarmingActivity f WHERE f.user.id = :userId")
    List<FarmingActivity> findByUserId(@Param("userId") Long userId);
    
    /**
     * 根据用户ID查找活动记录（分页）
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页活动记录列表
     */
    @Query("SELECT f FROM FarmingActivity f WHERE f.user.id = :userId")
    Page<FarmingActivity> findByUserId(@Param("userId") Long userId, Pageable pageable);

    /**
     * 根据用户ID查找活动记录，并按时间倒序排序
     * @param userId 用户ID
     * @return 活动记录列表
     */
    @Query("SELECT f FROM FarmingActivity f WHERE f.user.id = :userId ORDER BY f.timestamp DESC")
    List<FarmingActivity> findByUserIdOrderByTimestampDesc(@Param("userId") Long userId);
    
    /**
     * 根据用户ID查找活动记录，并按时间倒序排序（分页）
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页活动记录列表
     */
    @Query("SELECT f FROM FarmingActivity f WHERE f.user.id = :userId ORDER BY f.timestamp DESC")
    Page<FarmingActivity> findByUserIdOrderByTimestampDesc(@Param("userId") Long userId, Pageable pageable);

    /**
     * 查找指定时间之后的活动记录
     * @param timestamp 时间戳
     * @return 活动记录列表
     */
    List<FarmingActivity> findByTimestampAfter(LocalDateTime timestamp);
    
    /**
     * 查找指定时间之后的活动记录（分页）
     * @param timestamp 时间戳
     * @param pageable 分页参数
     * @return 分页活动记录列表
     */
    Page<FarmingActivity> findByTimestampAfter(LocalDateTime timestamp, Pageable pageable);

    /**
     * 统计特定用户在指定时间之后的活动数量
     */
    @Query("SELECT COUNT(a) FROM FarmingActivity a WHERE a.user.id = :userId AND a.timestamp > :date")
    long countByUserIdAndTimestampAfter(@Param("userId") Long userId, @Param("date") LocalDateTime date);

    /**
     * 按时间戳降序获取最近的活动记录
     */
    @Query("SELECT f FROM FarmingActivity f ORDER BY f.timestamp DESC")
    List<FarmingActivity> findTop10ByOrderByTimestampDesc();
    
    /**
     * 按时间戳降序获取所有活动记录（分页）
     * @param pageable 分页参数
     * @return 分页活动记录列表
     */
    Page<FarmingActivity> findAllByOrderByTimestampDesc(Pageable pageable);
    
    /**
     * 根据活动类型和用户ID查询活动记录（分页）
     * @param type 活动类型
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页活动记录列表
     */
    @Query("SELECT f FROM FarmingActivity f WHERE f.type = :type AND f.user.id = :userId")
    Page<FarmingActivity> findByTypeAndUserId(@Param("type") String type, @Param("userId") Long userId, Pageable pageable);

    /**
     * 根据用户统计活动数量
     */
    @Query("SELECT COUNT(f) FROM FarmingActivity f WHERE f.user = :user")
    Long countByUser(@Param("user") User user);

    /**
     * 获取用户最近的10条活动记录
     */
    @Query("SELECT f FROM FarmingActivity f WHERE f.user = :user ORDER BY f.createdAt DESC")
    List<FarmingActivity> findTop10ByUserOrderByCreatedAtDesc(@Param("user") User user);
}
